home *** CD-ROM | disk | FTP | other *** search
/ Amiga Format CD 44 / Amiga Format CD44 (1999-08-26)(Future Publishing)(GB)(Track 1 of 3)[!][issue 1999-10].iso / -serious- / misc / calculator / gadgets.c < prev    next >
C/C++ Source or Header  |  1999-07-12  |  9KB  |  350 lines

  1. /* Gadgets.c */
  2.  
  3. /* This file contains all the code for creation of the GUI and
  4. code for handling interaction with it. */
  5.  
  6. #include <exec/types.h>
  7. #include <clib/exec_protos.h>
  8. #include <intuition/intuition.h>
  9. #include <intuition/IntuitionBase.h>
  10. #include <intuition/gadgetclass.h>
  11. #include <libraries/gadtools.h>
  12. #include <graphics/gfxmacros.h>
  13. #include <graphics/GfxBase.h>
  14. #include <clib/dos_protos.h>
  15. #include <clib/intuition_protos.h>
  16. #include <clib/gadtools_protos.h>
  17. #include <clib/graphics_protos.h>
  18.  
  19. #include "Calculator.h"
  20.  
  21. /*
  22. ** Here is where all the initialization and creation of GadTools gadgets
  23. ** take place.  This function requires a pointer to a NULL-initialized
  24. ** gadget list pointer.  It returns a pointer to the last created gadget,
  25. ** which can be checked for success/failure.
  26. */
  27. struct Gadget *createAllGadgets(struct Gadget **glistptr, void *vi,
  28.     UWORD topborder, struct Gadget *my_gads[], struct StringInfo *gad_ptr[])
  29. {
  30. struct NewGadget ng;
  31. struct Gadget *gad;
  32.  
  33. /* All the gadget creation calls accept a pointer to the previous gadget, and
  34. ** link the new gadget to that gadget's NextGadget field.  Also, they exit
  35. ** gracefully, returning NULL, if any previous gadget was NULL.  This limits
  36. ** the amount of checking for failure that is needed.  You only need to check
  37. ** before you tweak any gadget structure or use any of its fields, and finally
  38. ** once at the end, before you add the gadgets.
  39. */
  40.  
  41. /* The following operation is required of any program that uses GadTools.
  42. ** It gives the toolkit a place to stuff context data.
  43. */
  44. gad = CreateContext(glistptr);
  45.  
  46. /* Since the NewGadget structure is unmodified by any of the CreateGadget()
  47. ** calls, we need only change those fields which are different.
  48. */
  49.  
  50. ng.ng_LeftEdge   = 10;
  51. ng.ng_TopEdge    = 10+topborder;
  52. ng.ng_Width      = 160;
  53. ng.ng_Height     = 12;
  54. ng.ng_GadgetText = NULL;
  55. ng.ng_TextAttr   = &Topaz80;
  56. ng.ng_VisualInfo = vi;
  57. ng.ng_GadgetID   = MYGAD_DISPLAY;
  58. ng.ng_Flags      = NG_HIGHLABEL;
  59. // GT Tags whose type is unknown - 13 75 76
  60. my_gads[MYGAD_DISPLAY] = gad = CreateGadget(NUMBER_KIND, gad, &ng,
  61. //                    GTNM_Format, ?,
  62.                     GTNM_Number,   0,
  63.                     GTNM_MaxNumberLen, 10,
  64.                     GTNM_Justification, GTJ_RIGHT,
  65.                     GTNM_Border,   TRUE,
  66.                     GT_Underscore,    '_',
  67.                     TAG_END);
  68. gad_ptr[0] = (struct StringInfo *) gad->SpecialInfo;
  69.  
  70. ng.ng_LeftEdge  = 20;
  71. ng.ng_TopEdge   += 20;
  72. ng.ng_Width      = 20;
  73. ng.ng_GadgetText = "9";
  74. ng.ng_GadgetID   = MYGAD_9;
  75. my_gads[MYGAD_9] = gad = CreateGadget(BUTTON_KIND, gad, &ng,
  76.                     GT_Underscore, '_',
  77.                     TAG_END);
  78.  
  79. ng.ng_LeftEdge  += 30;
  80. ng.ng_GadgetText = "8";
  81. ng.ng_GadgetID   = MYGAD_8;
  82. my_gads[MYGAD_8] = gad = CreateGadget(BUTTON_KIND, gad, &ng,
  83.                     GT_Underscore, '_',
  84.                     TAG_END);
  85.  
  86. ng.ng_LeftEdge  += 30;
  87. ng.ng_GadgetText = "7";
  88. ng.ng_GadgetID   = MYGAD_7;
  89. my_gads[MYGAD_7] = gad = CreateGadget(BUTTON_KIND, gad, &ng,
  90.                     GT_Underscore, '_',
  91.                     TAG_END);
  92.  
  93. ng.ng_LeftEdge  += 45;
  94. ng.ng_GadgetText = "C";
  95. ng.ng_GadgetID   = MYGAD_CLEAR;
  96. my_gads[MYGAD_CLEAR] = gad = CreateGadget(BUTTON_KIND, gad, &ng,
  97.                     GT_Underscore, '_',
  98.                     TAG_END);
  99.  
  100. ng.ng_TopEdge   += 20;
  101. ng.ng_LeftEdge  -= 105;
  102. ng.ng_GadgetText = "6";
  103. ng.ng_GadgetID   = MYGAD_6;
  104. my_gads[MYGAD_6] = gad = CreateGadget(BUTTON_KIND, gad, &ng,
  105.                     GT_Underscore, '_',
  106.                     TAG_END);
  107.  
  108. ng.ng_LeftEdge  += 30;
  109. ng.ng_GadgetText = "5";
  110. ng.ng_GadgetID   = MYGAD_5;
  111. my_gads[MYGAD_5] = gad = CreateGadget(BUTTON_KIND, gad, &ng,
  112.                     GT_Underscore, '_',
  113.                     TAG_END);
  114.  
  115. ng.ng_LeftEdge  += 30;
  116. ng.ng_GadgetText = "4";
  117. ng.ng_GadgetID   = MYGAD_4;
  118. my_gads[MYGAD_4] = gad = CreateGadget(BUTTON_KIND, gad, &ng,
  119.                     GT_Underscore, '_',
  120.                     TAG_END);
  121.  
  122. ng.ng_LeftEdge  += 30;
  123. ng.ng_GadgetText = "*";
  124. ng.ng_GadgetID   = MYGAD_MULTIPLY;
  125. my_gads[MYGAD_MULTIPLY] = gad = CreateGadget(BUTTON_KIND, gad, &ng,
  126.                     GT_Underscore, '_',
  127.                     TAG_END);
  128.  
  129. ng.ng_LeftEdge  += 30;
  130. ng.ng_GadgetText = "/";
  131. ng.ng_GadgetID   = MYGAD_DIVIDE;
  132. my_gads[MYGAD_DIVIDE] = gad = CreateGadget(BUTTON_KIND, gad, &ng,
  133.                     GT_Underscore, '_',
  134.                     TAG_END);
  135.  
  136. ng.ng_TopEdge   += 20;
  137. ng.ng_LeftEdge  -= 120;
  138. ng.ng_GadgetText = "3";
  139. ng.ng_GadgetID   = MYGAD_3;
  140. my_gads[MYGAD_3] = gad = CreateGadget(BUTTON_KIND, gad, &ng,
  141.                     GT_Underscore, '_',
  142.                     TAG_END);
  143.  
  144. ng.ng_LeftEdge  += 30;
  145. ng.ng_GadgetText = "2";
  146. ng.ng_GadgetID   = MYGAD_2;
  147. my_gads[MYGAD_2] = gad = CreateGadget(BUTTON_KIND, gad, &ng,
  148.                     GT_Underscore, '_',
  149.                     TAG_END);
  150.  
  151. ng.ng_LeftEdge  += 30;
  152. ng.ng_GadgetText = "1";
  153. ng.ng_GadgetID   = MYGAD_1;
  154. my_gads[MYGAD_1] = gad = CreateGadget(BUTTON_KIND, gad, &ng,
  155.                     GT_Underscore, '_',
  156.                     TAG_END);
  157.  
  158. ng.ng_LeftEdge  += 30;
  159. ng.ng_GadgetText = "+";
  160. ng.ng_GadgetID   = MYGAD_ADD;
  161. my_gads[MYGAD_ADD] = gad = CreateGadget(BUTTON_KIND, gad, &ng,
  162.                     GT_Underscore, '_',
  163.                     TAG_END);
  164.  
  165. ng.ng_LeftEdge  += 30;
  166. ng.ng_GadgetText = "-";
  167. ng.ng_GadgetID   = MYGAD_SUBTRACT;
  168. my_gads[MYGAD_SUBTRACT] = gad = CreateGadget(BUTTON_KIND, gad, &ng,
  169.                     GT_Underscore, '_',
  170.                     TAG_END);
  171.  
  172. ng.ng_TopEdge   += 20;
  173. ng.ng_LeftEdge  -= 120;
  174. ng.ng_GadgetText = ".";
  175. ng.ng_GadgetID   = MYGAD_POINT;
  176. my_gads[MYGAD_POINT] = gad = CreateGadget(BUTTON_KIND, gad, &ng,
  177.                     GA_Disabled, TRUE,
  178.                     GT_Underscore, '_',
  179.                     TAG_END);
  180.  
  181. ng.ng_LeftEdge  += 30;
  182. ng.ng_GadgetText = "0";
  183. ng.ng_GadgetID   = MYGAD_0;
  184. my_gads[MYGAD_0] = gad = CreateGadget(BUTTON_KIND, gad, &ng,
  185.                     GT_Underscore, '_',
  186.                     TAG_END);
  187.  
  188. ng.ng_LeftEdge  += 30;
  189. ng.ng_Width      = 50;
  190. ng.ng_GadgetText = "+/-";
  191. ng.ng_GadgetID   = MYGAD_CHANGE_SIGN;
  192. my_gads[MYGAD_CHANGE_SIGN] = gad = CreateGadget(BUTTON_KIND, gad, &ng,
  193.                     GT_Underscore, '_',
  194.                     TAG_END);
  195.  
  196. ng.ng_LeftEdge  += 60;
  197. ng.ng_Width      = 20;
  198. ng.ng_GadgetText = "=";
  199. ng.ng_GadgetID   = MYGAD_EQUALS;
  200. my_gads[MYGAD_EQUALS] = gad = CreateGadget(BUTTON_KIND, gad, &ng,
  201.                     GT_Underscore, '_',
  202.                     TAG_END);
  203.  
  204. return(gad);
  205. }
  206.  
  207. /*
  208. ** Function to handle a GADGETUP and also vanilla keys event.
  209. */
  210. BOOL handleGadgetEvent(struct Screen *mysc, struct Window *win, struct Gadget *gad, UWORD code,
  211.     struct Gadget *my_gads[], int& entered_number, int& no_figures)
  212. {
  213. switch (gad->GadgetID)
  214.     {
  215.     case MYGAD_9:
  216.         entered_number = 9;
  217.         no_figures++;
  218.         break;
  219.     case MYGAD_8:
  220.         entered_number = 8;
  221.         no_figures++;
  222.         break;
  223.     case MYGAD_7:
  224.         entered_number = 7;
  225.         no_figures++;
  226.         break;
  227.     case MYGAD_CLEAR:
  228.         entered_number = 0;
  229.         no_figures = 0;
  230.         GT_SetGadgetAttrs(my_gads[MYGAD_DISPLAY], win, NULL, GTNM_Number, 0, TAG_END);
  231.         return(TRUE);
  232.         break;
  233.     case MYGAD_6:
  234.         entered_number = 6;
  235.         no_figures++;
  236.         break;
  237.     case MYGAD_5:
  238.         entered_number = 5;
  239.         no_figures++;
  240.         break;
  241.     case MYGAD_4:
  242.         entered_number = 4;
  243.         no_figures++;
  244.         break;
  245.     case MYGAD_MULTIPLY:
  246.         return(TRUE);
  247.         break;
  248.     case MYGAD_DIVIDE:
  249.         return(TRUE);
  250.         break;
  251.     case MYGAD_3:
  252.         entered_number = 3;
  253.         no_figures++;
  254.         break;
  255.     case MYGAD_2:
  256.         entered_number = 2;
  257.         no_figures++;
  258.         break;
  259.     case MYGAD_1:
  260.         entered_number = 1;
  261.         no_figures++;
  262.         break;
  263.     case MYGAD_ADD:
  264.         return(TRUE);
  265.         break;
  266.     case MYGAD_SUBTRACT:
  267.         return(TRUE);
  268.         break;
  269.     case MYGAD_POINT:
  270.  
  271.         break;
  272.     case MYGAD_0:
  273.         if(no_figures == 0)
  274.             entered_number = 0;
  275.         else
  276.             entered_number = 10;
  277.         no_figures++;
  278.         break;
  279.     case MYGAD_CHANGE_SIGN:
  280.         return(TRUE);
  281.         break;
  282.     case MYGAD_EQUALS:
  283.         return(TRUE);
  284.         break;
  285.     }
  286.     switch(code)
  287.     {
  288.     case '9':
  289.         entered_number = 9;
  290.         no_figures++;
  291.         break;
  292.     case '8':
  293.         entered_number = 8;
  294.         no_figures++;
  295.         break;
  296.     case '7':
  297.         entered_number = 7;
  298.         no_figures++;
  299.         break;
  300.     case '6':
  301.         entered_number = 6;
  302.         no_figures++;
  303.         break;
  304.     case '5':
  305.         entered_number = 5;
  306.         no_figures++;
  307.         break;
  308.     case '4':
  309.         entered_number = 4;
  310.         no_figures++;
  311.         break;
  312.     case '*':
  313.         return(TRUE);
  314.         break;
  315.     case '/':
  316.         return(TRUE);
  317.         break;
  318.     case '3':
  319.         entered_number = 3;
  320.         no_figures++;
  321.         break;
  322.     case '2':
  323.         entered_number = 2;
  324.         no_figures++;
  325.         break;
  326.     case '1':
  327.         entered_number = 1;
  328.         no_figures++;
  329.         break;
  330.     case '+':
  331.         return(TRUE);
  332.         break;
  333.     case '-':
  334.         return(TRUE);
  335.         break;
  336.     case '.':
  337.  
  338.         break;
  339.     case '0':
  340.         if(no_figures == 0)
  341.             entered_number = 0;
  342.         else
  343.             entered_number = 10;
  344.         no_figures++;
  345.         break;
  346.     }
  347.     return(FALSE);
  348. }
  349.  
  350.